package com.ddwanglife.bilibili;
//commons-io   fastjson
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.io.FileUtils;

import java.io.*;
import java.util.*;

/**
 * 生成目录
 *
 */
public class CreateVedioDetailDirector {
    public static String nowVedioNumber = null; //当前处理的视频编号
    public static Map<String,String> titleSet =  new HashMap<>();
    private static Map<Integer,String> secondTitleMap = new HashMap<>();//二级标题集合
    private static String outPutPath = "E://ztt//";//文件输出路径，不包含视频名称

    public static void appendContent(String filePath, String content) {
        try {
            FileWriter writer = new FileWriter(filePath, true);
            writer.write(content);
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
//        String basePath = "C:\\Users\\wangdongdong\\Desktop\\bilibili\\";
        String basePath = "D:\\学习视频\\download\\";
        File rootFile = new File(basePath);
        if(rootFile.exists()){
            File[] vedioSet = rootFile.listFiles(x->x.isDirectory());
            //1,获取到视频目录
            for(File vedioRootFile : vedioSet){
                if (vedioRootFile.exists()) {
                    nowVedioNumber = vedioRootFile.getName();
                    titleSet.put(vedioRootFile.getName(),null);
                    //2,子目录如果存在，则获取子文件，默认子目录在获取后，是按照字符排序的，需要重新转为数字
                    File[] files = vedioRootFile.listFiles(x->x.isDirectory());
                    Arrays.sort(files,(o1,o2)-> Integer.parseInt(o1.getName())-Integer.parseInt(o2.getName()));
                    //3,获取子文件的文本内容，并解析获取文件目录（此时文件夹队列是有序的）
                    for (File secondFile : files) {
                        //4,设置标题
                        initSecondTitleMap(secondFile);
                    }
                }
            }
        }
    }

    private static void initSecondTitleMap(File secondFile) {
        File[] entrys = secondFile.listFiles(pathname -> pathname.getName().contains("entry"));
        //5，获取到了entry
        File entryFile = entrys[0];
        if (entryFile.exists()) {
            String jsonString = null;
            try {
                jsonString = FileUtils.readFileToString(entryFile);
            } catch (IOException e) {
                e.printStackTrace();
            }
            JSONObject jsonObject = JSONObject.parseObject(jsonString);
            String title = titleSet.get(nowVedioNumber);
            if (title == null) {
                title = regPath(jsonObject.getString("title"));
                titleSet.put(nowVedioNumber,title);

                System.out.println("title:"+title);
                //判断目录是否存在，不存在则创建
                File outputFileDirectory = new File(outPutPath+title);
                if(!outputFileDirectory.exists()){
                    outputFileDirectory.mkdirs();
                }
            }
            String secondTitle = jsonObject.getJSONObject("page_data").getString("part");
            Integer keyNumber = Integer.parseInt(secondFile.getName());//视频序号
            secondTitleMap.put(keyNumber,secondTitle);
            //5,解析合并视频
            File[] videoDirectorys = secondFile.listFiles(x -> x.isDirectory());
            for(File videoDirecotry : videoDirectorys){
                String videoPath = videoDirecotry.getPath();
                File outputVedioFile = new File(regPath(outPutPath+title+"//"+keyNumber+"_"+secondTitle+".mp4"));
                System.out.println("      -----keyNumber:"+keyNumber +",该文件是否存在："+outputVedioFile.exists());
                if(!outputVedioFile.exists()){
                   String commondStr =  "ffmpeg -loglevel quiet -i "+videoPath+"//video.m4s " +
                           "-i "+videoPath+"//audio.m4s -c copy "+outputVedioFile.getPath();
                    operateCmd(commondStr);
                }
            }
        }
    }
    private static String regPath(String originalStr){
        return originalStr.replaceAll("\\s+","");
    }
    private static void operateCmd(String commondStr){
        //问题的关键是处在输入流缓冲区那个地方，子进程的产生的输出流没有被JVM及时的读取最后缓冲区满了就卡住了。
        // 如果我们能够不让子进程向输入流写入数据，就可以解决这个问题
        try {
            Process process = Runtime.getRuntime().exec(commondStr);
            process.waitFor();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
